/*!
 * jQuery Placeholder Plugin v2.3.1
 * https://github.com/mathiasbynens/jquery-placeholder
 *
 * Copyright 2011, 2015 Mathias Bynens
 * Released under the MIT license
 */
 layui.define('placeholder', function(exports) {
    var jQuery = layui.jquery,
      $ = jQuery;
    (function(factory) {
        if (typeof define === 'function' && define.amd) {
            // AMD
            define(['jquery'], factory);
        } else if (typeof module === 'object' && module.exports) {
            factory(require('jquery'));
        } else {
            // Browser globals
            factory(jQuery);
        }
    }(function($) {

        /****
         * Allows plugin behavior simulation in modern browsers for easier debugging.
         * When setting to true, use attribute "placeholder-x" rather than the usual "placeholder" in your inputs/textareas
         * i.e. <input type="text" placeholder-x="my placeholder text" />
         */
        var debugMode = false;

        // Opera Mini v7 doesn't support placeholder although its DOM seems to indicate so
        var isOperaMini = Object.prototype.toString.call(window.operamini) === '[object OperaMini]';
        var isInputSupported = 'placeholder' in document.createElement('input') && !isOperaMini && !debugMode;
        var isTextareaSupported = 'placeholder' in document.createElement('textarea') && !isOperaMini && !debugMode;
        var valHooks = $.valHooks;
        var propHooks = $.propHooks;
        var hooks;
        var placeholder;
        var settings = {};

        if (isInputSupported && isTextareaSupported) {

            placeholder = $.fn.placeholder = function() {
                return this;
            };

            placeholder.input = true;
            placeholder.textarea = true;

        } else {

            placeholder = $.fn.placeholder = function(options) {

                var defaults = {customClass: 'placeholder'};
                settings = $.extend({}, defaults, options);

                return this.filter((isInputSupported ? 'textarea' : ':input') + '[' + (debugMode ? 'placeholder-x' : 'placeholder') + ']')
                    .not('.'+settings.customClass)
                    .not(':radio, :checkbox, [type=hidden]')
                    .bind({
                        'focus.placeholder': clearPlaceholder,
                        'blur.placeholder': setPlaceholder
                    })
                    .data('placeholder-enabled', true)
                    .trigger('blur.placeholder');
            };

            placeholder.input = isInputSupported;
            placeholder.textarea = isTextareaSupported;

            hooks = {
                'get': function(element) {

                    var $element = $(element);
                    var $passwordInput = $element.data('placeholder-password');

                    if ($passwordInput) {
                        return $passwordInput[0].value;
                    }

                    return $element.data('placeholder-enabled') && $element.hasClass(settings.customClass) ? '' : element.value;
                },
                'set': function(element, value) {

                    var $element = $(element);
                    var $replacement;
                    var $passwordInput;

                    if (value !== '') {

                        $replacement = $element.data('placeholder-textinput');
                        $passwordInput = $element.data('placeholder-password');

                        if ($replacement) {
                            clearPlaceholder.call($replacement[0], true, value) || (element.value = value);
                            $replacement[0].value = value;

                        } else if ($passwordInput) {
                            clearPlaceholder.call(element, true, value) || ($passwordInput[0].value = value);
                            element.value = value;
                        }
                    }

                    if (!$element.data('placeholder-enabled')) {
                        element.value = value;
                        return $element;
                    }

                    if (value === '') {

                        element.value = value;

                        // Setting the placeholder causes problems if the element continues to have focus.
                        if (element != safeActiveElement()) {
                            // We can't use `triggerHandler` here because of dummy text/password inputs :(
                            setPlaceholder.call(element);
                        }

                    } else {

                        if ($element.hasClass(settings.customClass)) {
                            clearPlaceholder.call(element);
                        }

                        element.value = value;
                    }
                    // `set` can not return `undefined`; see http://jsapi.info/jquery/1.7.1/val#L2363
                    return $element;
                }
            };

            if (!isInputSupported) {
                valHooks.input = hooks;
                propHooks.value = hooks;
            }

            if (!isTextareaSupported) {
                valHooks.textarea = hooks;
                propHooks.value = hooks;
            }

            $(function() {
                // Look for forms
                $(document).delegate('form', 'submit.placeholder', function() {

                    // Clear the placeholder values so they don't get submitted
                    var $inputs = $('.'+settings.customClass, this).each(function() {
                        clearPlaceholder.call(this, true, '');
                    });

                    setTimeout(function() {
                        $inputs.each(setPlaceholder);
                    }, 10);
                });
            });

            // Clear placeholder values upon page reload
            $(window).bind('beforeunload.placeholder', function() {

                var clearPlaceholders = true;

                try {
                    // Prevent IE javascript:void(0) anchors from causing cleared values
                    if (document.activeElement.toString() === 'javascript:void(0)') {
                        clearPlaceholders = false;
                    }
                } catch (exception) { }

                if (clearPlaceholders) {
                    $('.'+settings.customClass).each(function() {
                        this.value = '';
                    });
                }
            });
        }

        function args(elem) {
            // Return an object of element attributes
            var newAttrs = {};
            var rinlinejQuery = /^jQuery\d+$/;

            $.each(elem.attributes, function(i, attr) {
                if (attr.specified && !rinlinejQuery.test(attr.name)) {
                    newAttrs[attr.name] = attr.value;
                }
            });

            return newAttrs;
        }

        function clearPlaceholder(event, value) {

            var input = this;
            var $input = $(this);

            if (input.value === $input.attr((debugMode ? 'placeholder-x' : 'placeholder')) && $input.hasClass(settings.customClass)) {

                input.value = '';
                $input.removeClass(settings.customClass);

                if ($input.data('placeholder-password')) {

                    $input = $input.hide().nextAll('input[type="password"]:first').show().attr('id', $input.removeAttr('id').data('placeholder-id'));

                    // If `clearPlaceholder` was called from `$.valHooks.input.set`
                    if (event === true) {
                        $input[0].value = value;

                        return value;
                    }

                    $input.focus();

                } else {
                    input == safeActiveElement() && input.select();
                }
            }
        }

        function setPlaceholder(event) {
            var $replacement;
            var input = this;
            var $input = $(this);
            var id = input.id;

            // If the placeholder is activated, triggering blur event (`$input.trigger('blur')`) should do nothing.
            if (event && event.type === 'blur' && $input.hasClass(settings.customClass)) {
                return;
            }

            if (input.value === '') {
                if (input.type === 'password') {
                    if (!$input.data('placeholder-textinput')) {

                        try {
                            $replacement = $input.clone().prop({ 'type': 'text' });
                        } catch(e) {
                            $replacement = $('<input>').attr($.extend(args(this), { 'type': 'text' }));
                        }

                        $replacement
                            .removeAttr('name')
                            .data({
                                'placeholder-enabled': true,
                                'placeholder-password': $input,
                                'placeholder-id': id
                            })
                            .bind('focus.placeholder', clearPlaceholder);

                        $input
                            .data({
                                'placeholder-textinput': $replacement,
                                'placeholder-id': id
                            })
                            .before($replacement);
                    }

                    input.value = '';
                    $input = $input.removeAttr('id').hide().prevAll('input[type="text"]:first').attr('id', $input.data('placeholder-id')).show();

                } else {

                    var $passwordInput = $input.data('placeholder-password');

                    if ($passwordInput) {
                        $passwordInput[0].value = '';
                        $input.attr('id', $input.data('placeholder-id')).show().nextAll('input[type="password"]:last').hide().removeAttr('id');
                    }
                }

                $input.addClass(settings.customClass);
                $input[0].value = $input.attr((debugMode ? 'placeholder-x' : 'placeholder'));

            } else {
                $input.removeClass(settings.customClass);
            }
        }

        function safeActiveElement() {
            // Avoid IE9 `document.activeElement` of death
            try {
                return document.activeElement;
            } catch (exception) {}
        }
    }));

    exports('placeholder');
});
